using System;
using System.Collections.Generic;
using System.Reflection;
using System.Windows.Forms;
using App.Controlador;
using App.Modelo;
using App.Modelo.Menu;
using App.Persistencia;
using System.Linq;

namespace App.Seguridad.Vista.Menu
{
    /// <summary>
    /// Clase especializada que utiliza la Controladora de seguridad 
    /// y el usuario para determinar los permisos
    /// </summary>
    public class PerfilesMenuControlador : MenuControladorAbstract
    {
        Usuario _Usuario;
        IList<Perfil> _Perfiles;

        public Usuario Usuario
        {
            get
            {
                if (_Usuario == null)
                    _Usuario = ModuloSeguridad.Instance.UsuarioActual;
                return _Usuario;
            }
            set
            {
                _Usuario = value;
            }
        }

        public IList<Perfil> Perfiles
        {
            get
            {
                if (_Perfiles == null)
                    _Perfiles = ModuloSeguridad.Instance.FabricaControladoras.Factory<ControladoraPerfiles>().Get(Usuario);
                    
                return _Perfiles;
            }
        }

        public PerfilesMenuControlador(MenuStrip menu)
        {
            Menu = menu;

            // me registro al evento UsuarioModificado para actualizar el menu
            ControladoraUsuarios.UsuarioModificado
                += Seguridad_UsuarioModificado;

            // me registro al evento GrupoModificado para actualizar el menu

            ControladoraGrupos.GrupoModificado
                += Grupos_GrupoModificado;
        }

        public PerfilesMenuControlador(MenuStrip menu, Modelo.Menu.MenuContenedor Model)
            : this(menu)
        {
            this.Model = Model;
        }

        void Grupos_GrupoModificado(object sender, GrupoEventArgs e)
        {
            // blanqueo la propiedad para que se vuelva a consultar a la controladora
            _Perfiles = null;

            // is el grupo modificado es el grupo del usuario 
            
            if (Usuario.Grupos.Any(gr => gr.Equals(e.Grupo)))
            {
                Refrescar();
            }
        }

        void Seguridad_UsuarioModificado(object sender, UsuarioEventArgs e)
        {
            // blanqueo la propiedad para que se vuelva a consultar a la controladora
            _Perfiles = null;

            // si es el usuario actual
            if (e.Usuario.Equals(Usuario))
            {
                Refrescar();
            }
        }

        /// <summary>
        /// Implementacion del metodo VerificarPermiso que comprueba si el usuario tiene permiso a una determinada accion
        /// consultando a la controladora de seguridad
        /// </summary>
        /// <param name="boton"></param>
        /// <returns></returns>
        protected override bool VerificarPermiso(MenuBoton boton)
        {
            if (String.IsNullOrEmpty(boton.Command))
                return true;

            var perfil = ControladoraPerfiles.ParsePerfil(boton.Command);

            if (perfil.Formulario == null || perfil.Funcion == null)
                return true;

            foreach (Perfil p in Perfiles)
                if (p.Coincide(perfil))
                    return true;
            return false;
        }

        private ControladoraPerfiles _ControladoraPerfiles;
        public ControladoraPerfiles ControladoraPerfiles
        {  
            get
            {
                if (null == _ControladoraPerfiles)
                    _ControladoraPerfiles =
                        ModuloSeguridad.Instance.FabricaControladoras.Factory<ControladoraPerfiles>();
                return _ControladoraPerfiles;
            }
            set
            {
                _ControladoraPerfiles = value;
            }
        }


    }
}